package no.group.gowther.dao.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

import java.sql.Timestamp;
import java.time.LocalDateTime;

/**
 * @author ayatsuji
 * @date 2022-05-10 22:48
 * @since
 */
public class Tag {
    private static final String TAG_LEVEL_SEPARATOR = "/";
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Boolean root;
    private Timestamp createdAt;
    private Timestamp updatedAt;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getRoot() {
        return root;
    }

    public void setRoot(Boolean root) {
        this.root = root;
    }

    public Timestamp getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Timestamp createdAt) {
        this.createdAt = createdAt;
    }

    public Timestamp getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Timestamp updatedAt) {
        this.updatedAt = updatedAt;
    }

    public static Tag createRootTag(String tagName) {
        Tag newTag = new Tag();
        newTag.setCreatedAt(Timestamp.valueOf(LocalDateTime.now()));
        newTag.setName(TAG_LEVEL_SEPARATOR + tagName);
        newTag.setRoot(true);
        return newTag;
    }

    public static Tag createSubTag(String parentTagName, String tagName) {
        Tag newTag = new Tag();
        newTag.setCreatedAt(Timestamp.valueOf(LocalDateTime.now()));
        newTag.setName(parentTagName + TAG_LEVEL_SEPARATOR + tagName);
        newTag.setRoot(false);
        return newTag;
    }

    public String generateNewCompleteTagName(String newTagName) {
        final int i = name.lastIndexOf(TAG_LEVEL_SEPARATOR);
        return name.substring(0, i) + TAG_LEVEL_SEPARATOR + newTagName;
    }

    public String createSubTagPrefix() {
        return name + TAG_LEVEL_SEPARATOR;
    }

    public String extractLastName() {
        final int i = name.lastIndexOf(TAG_LEVEL_SEPARATOR);
        return name.substring(i + 1);
    }

//    @JsonIgnore
//    public boolean isRootTag() {
//        return !this.name.contains(TAG_LEVEL_SEPARATOR);
//    }
//
//    public String extractRoot() {
//        return tagName.substring(0, tagName.indexOf(TAG_LEVEL_SEPARATOR));
//    }
//
//    public void addSubTag(Tag subTag) {
//        if (this.subTag == null) {
//            this.subTag = new HashSet<>();
//        }
//        if (isMyChildTag(subTag)) {
//            this.subTag.add(subTag);
//            return;
//        }
//        for (Tag tag: this.subTag) {
//            if (tag.isMySubTag(subTag)) {
//                tag.addSubTag(subTag);
//                return;
//            }
//        }
//    }
//
//    private boolean isMyChildTag(Tag subTag) {
//        return !excludeParentTagPath(subTag).contains(TAG_LEVEL_SEPARATOR);
//    }
//
//    public boolean isMySubTag(Tag subTag) {
//        final String subTagName = subTag.getTagName();
//        return subTagName.startsWith(getTagName()) &&
//                (subTagName.length() != getTagName().length() && subTagName.charAt(getTagName().length()) == '/');
//    }
//
//    private String excludeParentTagPath(Tag subTag) {
//        return subTag.getTagName().substring(this.tagName.length() + 1);
//    }

//    public Set<String> extendTag() {
//        if (isRootTag()) {
//            return Collections.singleton(tagName);
//        }
//        Set<String> extendTag = new HashSet<>();
//        int index = -1;
//        while ((index = tagName.indexOf(TAG_LEVEL_SEPARATOR, index + 1)) != -1) {
//            extendTag.add(tagName.substring(0, index));
//        }
//        extendTag.add(tagName);
//        return extendTag;
//    }

//    @Override
//    public int compareTo(Tag o) {
//        return tagName.compareTo(o.tagName);
//    }
//
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Tag tag = (Tag) o;
//        return Objects.equals(tagName, tag.tagName);
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(tagName);
//    }

}
